<%@ Page Trace="False" Language="vb" aspcompat="false" debug="true" validateRequest="false"%> 
<%@ Import Namespace=System.Drawing %>
<%@ Import Namespace=System.Drawing.Imaging %>
<%@ Import Namespace=System %>
<%@ Import Namespace=System.Web %>
<SCRIPT LANGUAGE="VBScript" runat="server">
const Lx = 200	' max width for thumbnails
const Ly = 240	' max height for thumbnails
const upload_dir = "/upload_resize_test/"	' directory to upload file
const upload_original = "sample"	' filename to save original as (suffix added by script)
const upload_thumb = "thumb"	' filename to save thumbnail as (suffix added by script)
const upload_max_size = 25	' max size of the upload (KB) note: this doesn't override any server upload limits
dim fileExt	' used to store the file extension (saves finding it mulitple times)
dim newWidth, newHeight as integer ' new width/height for the thumbnail
dim l2	' temp variable used when calculating new size
dim fileFld as HTTPPostedFile	' used to grab the file upload from the form
Dim originalimg As System.Drawing.Image	' used to hold the original image
dim msg	' display results
dim upload_ok as boolean	' did the upload work ?
</script>
<%
    
    
    originalimg = System.Drawing.Image.FromFile("img\oldin.jpg")
    ' work out the width/height for the thumbnail. Preserve aspect ratio and honour max width/height
    ' Note: if the original is smaller than the thumbnail size it will be scaled up
    If (originalimg.Width / Lx) > (originalimg.Width / Ly) Then
        l2 = originalimg.Width
        newWidth = Lx
        newHeight = originalimg.Height * (Lx / l2)
        If newHeight > Ly Then
            newWidth = newWidth * (Ly / newHeight)
            newHeight = Ly
        End If
    Else
        l2 = originalimg.Height
        newHeight = Ly
        newWidth = originalimg.Width * (Ly / l2)
        If newWidth > Lx Then
            newHeight = newHeight * (Lx / newWidth)
            newWidth = Lx
        End If
    End If

    Dim thumb As New Bitmap(newWidth, newHeight)

    'Create a graphics object           
    Dim gr_dest As Graphics = Graphics.FromImage(thumb)

    ' just in case it's a transparent GIF force the bg to white 
    Dim sb = New SolidBrush(System.Drawing.Color.White)
    gr_dest.FillRectangle(sb, 0, 0, thumb.Width, thumb.Height)

    'Re-draw the image to the specified height and width
    gr_dest.DrawImage(originalimg, 0, 0, thumb.Width, thumb.Height)
       
    Try
        fileExt = System.IO.Path.GetExtension(fileFld.FileName).ToLower()
        originalimg.Save(Server.MapPath(upload_dir & upload_original & fileExt), originalimg.RawFormat)
        thumb.Save(Server.MapPath(upload_dir & upload_thumb & fileExt), originalimg.RawFormat)
        msg = "Uploaded " & fileFld.FileName & " to " & Server.MapPath(upload_dir & upload_original & fileExt)
        upload_ok = True
    Catch ex As Exception
        msg = "Sorry, there was a problem saving the image.<br>"
        msg = msg + ex.Message
    End Try
    ' Housekeeping for the generated thumbnail
    If Not thumb Is Nothing Then
        thumb.Dispose()
        thumb = Nothing
    End If
    
    
    
    
    
    
    
randomize() ' used to help the cache-busting on the preview images
upload_ok = false
if lcase(Request.ServerVariables("REQUEST_METHOD"))="post" then
	fileFld = request.files(0)	' get the first file uploaded from the form (note:- you can use this to itterate through more than one image)
	if fileFld.ContentLength > upload_max_size * 1024 then
		msg = "Sorry, the image must be less than " & upload_max_size & "Kb"
	else
		try
			originalImg = System.Drawing.Image.FromStream(fileFld.InputStream)
			' work out the width/height for the thumbnail. Preserve aspect ratio and honour max width/height
			' Note: if the original is smaller than the thumbnail size it will be scaled up
			If (originalImg.Width/Lx) > (originalImg.Width/Ly) Then
				L2 = originalImg.Width
				newWidth = Lx
				newHeight = originalImg.Height * (Lx / L2)
				if newHeight > Ly then
					newWidth = newWidth * (Ly / newHeight)
					newHeight = Ly
				end if
			Else
				L2 = originalImg.Height
				newHeight = Ly
				newWidth = originalImg.Width * (Ly / L2)
				if newWidth > Lx then
					newHeight = newHeight * (Lx / newWidth)
					newWidth = Lx
				end if
			End If

            Dim thumb As New Bitmap(newWidth, newHeight)

            'Create a graphics object           
            Dim gr_dest As Graphics = Graphics.FromImage(thumb)

			' just in case it's a transparent GIF force the bg to white 
			dim sb = new SolidBrush(System.Drawing.Color.White)
			gr_dest.FillRectangle(sb, 0, 0, thumb.Width, thumb.Height)

            'Re-draw the image to the specified height and width
			gr_dest.DrawImage(originalImg, 0, 0, thumb.Width, thumb.Height)
       
			try
				fileExt = System.IO.Path.GetExtension(fileFld.FileName).ToLower()
				originalImg.save(Server.MapPath(upload_dir & upload_original & fileExt), originalImg.rawformat)
				thumb.save(Server.MapPath(upload_dir & upload_thumb & fileExt), originalImg.rawformat)
				msg = "Uploaded " & fileFld.FileName & " to " & Server.MapPath(upload_dir & upload_original & fileExt)
				upload_ok = true
                Catch ex As Exception
                    msg = "Sorry, there was a problem saving the image.<br>"
                    msg = msg + ex.Message
			end try
			' Housekeeping for the generated thumbnail
			if not thumb is nothing then
				thumb.Dispose()
				thumb = nothing
			end if
		catch
			msg = "Sorry, that was not an image we could process."
		end try
	end if

	' House Keeping !
	if not originalImg is nothing then
		originalImg.Dispose()
		originalImg = nothing
	end if

end if
%>
<html>
<head>
<title>ASP.NET File Upload and Resize Sample</title>
<META NAME="Description" CONTENT="ASP.NET File Upload and Resize Sample (Hybrid VB.NET)">
<META NAME="Keywords" CONTENT="ASP.NET, ASP, NET, VB, VBScript, Image, Upload, Resize, Thumbnail, Constrain, Filesize, File, Size, Free">
<META NAME="Copyright" CONTENT="Rufan-Redi Pty Ltd 2005">
<META NAME="Author" CONTENT="System developed by Jeremy at http://www.Rufan-Redi.com">
</head>
<body>

<p><b>Hybrid ASP.NET File Upload and Resize Sample (VB.NET)</b>
<br>Upload and resize a GIP/JPG/PNG images, ensuring filesizes are optimum.</p>

<form enctype="multipart/form-data" method="post" runat="server">
<table>
<tr><td>Select the file to upload:</td><td><input type="file" name="upload_file"></td></tr>
<tr><td colspan=2>Max upload size <%=upload_max_size%>Kb, gif/jpg/png only</td></tr>
<tr><td colspan=2><input type="submit" value="Upload"></td></tr>
</table>
</form>

<%
if upload_ok then
%>
<table>
<tr>
<td valign=top><img src="<%=upload_dir & upload_original & fileExt & "?" & rnd()%>"></td>
<td valign=top><img src="<%=upload_dir & upload_thumb & fileExt & "?" & rnd()%>"></td>
</tr>
</table>
<%
else
	response.write(msg)
end if
%>

<p>This sample script was written after a fair bit of frustration searching the web for a good ASP.NET (specifically VB.NET) sample of an easy to use block of code that would allow a user to upload an image and have it resized (in this case to a thumbnail where the aspect ratio is maintained and a maximum width / height can be specified) and saved to the server without filesizes blowing out.</p>
<p>The .Net graphics function getThumbnail, while at first glance is very helpful, is not your friend. Most digital cameras, for instance, create a thumbnail that is saved as part of the original image - and this is what the getThumbnail will extract for you (rather than create one from scratch). As these embedded thumbnails can be as small as 40px by 40px it's often not much use when you want a 100px by 100px thumbnail !
<p>The basic resize algorithms are well understood, and there are lots of those out there just a Google away (although the added restriction of maximum constraints isn't often bothered with) but the biggest issue I had with my original search was finding a sample where the filesize for the thumbnail didn't expand to greater than the original filesize ! It turns out that in most cases the vital 'rawformat' parameter was being missed from the save... so my example uses that and hopefully stops people being tripped up by this in the future !</p>
</body>
</html>